package com.woniu.user.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.dto.AreaCodeDTO;
import com.woniu.exception.XinanException;
import com.woniu.exception.user.UserException;
import com.woniu.user.entity.AreaCode;
import com.woniu.user.mapper.AreaCodeMapper;
import com.woniu.user.service.AreaCodeService;
import com.woniu.utils.EnumException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;

/**
 * <p>
 * 区域表 服务实现类
 * </p>
 *
 * @author ly
 * @since 2024年12月05日
 */
@Service
public class AreaCodeServiceImpl extends ServiceImpl<AreaCodeMapper, AreaCode> implements AreaCodeService {

    @Autowired
    private AreaCodeMapper areaCodeMapper;

    /**
     * 添加区域代码
     * @param areaCode 要添加的区域代码，不能为空或null
     * @return 插入操作影响的行数
     * @throws XinanException 如果区域代码为空或null，则抛出此异常
     */
    @Override
    public Integer addAreaCode(String areaCode) throws XinanException {
        // 检查区域代码是否为空或null
        if (areaCode == null || areaCode.equals("")) {
            // 如果区域代码无效，抛出用户异常
            throw new UserException(EnumException.INVALID_PARAMETER);
        }
        // 调用Mapper方法插入区域代码，并返回影响的行数
        Integer result = areaCodeMapper.insertAreaCode(areaCode);
        return result;
    }

    /**
     * 获取区域代码列表
     * @return 区域代码DTO列表，如果列表为空，则返回空列表
     * @throws XinanException 如果在获取区域代码过程中发生异常，则抛出此异常
     */
    @Override
    public List<AreaCodeDTO> listAreaCode() throws XinanException {
        // 从数据库中获取所有区域代码信息
        List<AreaCode> areaCodes = areaCodeMapper.listAreaCode();
        // 检查获取的区域代码列表是否为空
        if (areaCodes != null && areaCodes.size() > 0) {
            // 将获取的区域代码列表转换为DTO列表并返回
            List<AreaCodeDTO> areaCodeDTOList = BeanUtil.copyToList(areaCodes, AreaCodeDTO.class);
            return areaCodeDTOList;
        }
        // 如果区域代码列表为空，则返回一个空列表
        return Collections.emptyList();
    }

    /**
     * 根据区域代码 ID 删除区域代码信息
     * @param areaCodeId 区域代码 ID，用于标识要删除的区域代码信息
     * @return 返回删除操作影响的行数
     * @throws XinanException 如果区域代码 ID 无效或区域代码被引用，则抛出此异常
     */
    @Override
    public Integer deleteAreaCode(Integer areaCodeId) throws XinanException {
        // 检查区域代码 ID 是否有效
        if (areaCodeId == null || areaCodeId <= 0) {
            throw new UserException(EnumException.INVALID_PARAMETER);
        }
        // 使用原生 SQL 查询检查是否存在关联的用户信息
        boolean isUsed = areaCodeMapper.isAreaCodeInUse(areaCodeId);
        // 如果区域代码被引用，则抛出异常，表示不能删除
        if (isUsed) {
            throw new UserException(EnumException.DATABASE_ERROR);
        }
        // 调用 mapper 方法删除区域代码信息
        Integer result = areaCodeMapper.deleteAreaCodeId(areaCodeId);
        return result;
    }

    @Override
    public String getAreaCodeById(Integer areaCodeId) throws Exception {
        if (areaCodeId == null || areaCodeId <= 0) {
            throw new UserException(EnumException.INVALID_PARAMETER);
        }
        AreaCode areaCode = areaCodeMapper.selectById(areaCodeId);
        if (areaCode != null) {
            return areaCode.getAreaCodeName();
        }
        return null;
    }
}
